import mqtt from 'mqtt';

// MQTT 客户端实例
let client = null;

// 默认连接配置
const DEFAULT_CONNECT_OPTIONS = {
  clientId: 'default_client',
  username: 'guest',
  password: 'guest',
};

// 默认订阅配置
const DEFAULT_SUBSCRIBE_OPTIONS = {
  qos: 1,
};

// 默认发布配置
const DEFAULT_PUBLISH_OPTIONS = {
  qos: 1,
};

/**
 * 连接 MQTT 服务器
 * @param {string} url - MQTT 服务器地址，例如: 'mqtt://localhost:1883'
 * @param {Object} options - 连接选项，包含客户端 ID、用户名、密码等
 * @param {function} onConnect - 连接成功回调函数
 * @param {function} onMessage - 收到消息回调函数
 * @param {function} onError - 连接出错回调函数
 */
export function connectMqtt(url, options = {}, onConnect, onMessage, onError) {
  // 合并默认配置和传入配置
  const connectOptions = { ...DEFAULT_CONNECT_OPTIONS, ...options };
  // 创建 MQTT 客户端实例
  client = mqtt.connect(url, connectOptions);

  // 连接成功事件
  client.on('connect', () => {
    console.log('MQTT 连接成功');
    if (typeof onConnect === 'function') {
      onConnect();
    }
  });

  // 收到消息事件
  client.on('message', (topic, message) => {
    const messageStr = message.toString();
    if (typeof onMessage === 'function') {
      onMessage(topic, messageStr);
    }
  });

  // 连接出错事件
  client.on('error', (error) => {
    console.error('MQTT 连接出错:', error);
    if (typeof onError === 'function') {
      onError(error);
    }
  });
  return client;
}

/**
 * 订阅 MQTT 主题
 * @param {string|Array<string>} topics - 要订阅的主题，可以是单个主题字符串或主题数组
 * @param {Object} options - 订阅选项
 * @param {function} callback - 订阅结果回调函数
 */
export function subscribe(topics, options = {}, callback) {
  if (client) {
    // 合并默认订阅配置和传入配置
    const subscribeOptions = { ...DEFAULT_SUBSCRIBE_OPTIONS, ...options };
    client.subscribe(topics, subscribeOptions, (error, granted) => {
      if (error) {
        console.error('订阅主题出错:', error);
      } else {
        console.log('订阅主题成功:', granted);
      }
      if (typeof callback === 'function') {
        callback(error, granted);
      }
    });
  } else {
    console.error('MQTT 客户端未连接');
  }
}

/**
 * 发布 MQTT 消息
 * @param {string} topic - 发布消息的主题
 * @param {string} message - 要发布的消息内容
 * @param {Object} options - 发布选项
 * @param {function} callback - 发布结果回调函数
 */
export function publish(topic, message, options = {}, callback) {
  if (client) {
    // 合并默认发布配置和传入配置
    const publishOptions = { ...DEFAULT_PUBLISH_OPTIONS, ...options };
    client.publish(topic, message, publishOptions, (error) => {
      if (error) {
        console.error('发布消息出错:', error);
      } else {
        console.log('发布消息成功');
      }
      if (typeof callback === 'function') {
        callback(error);
      }
    });
  } else {
    console.error('MQTT 客户端未连接');
  }
}

/**
 * 断开 MQTT 连接
 * @param {function} callback - 断开连接结果回调函数
 */
export function disconnect(callback) {
  if (client) {
    client.end(false, () => {
      console.log('MQTT 连接已断开');
      if (typeof callback === 'function') {
        callback();
      }
    });
  } else {
    console.error('MQTT 客户端未连接');
  }
}